/**
 * File: queue.c
 * 基于链表实现队列
 */

#include "queue.h"

Queue *init_queue(void) // 初始化空队列
{
  Queue *queue;
  queue = (Queue *)malloc(sizeof(Queue));
  queue->size = 0;
  queue->head = NULL;
  queue->tail = NULL; // 此时队为空，对首队尾都是空
  return queue;
}

int get_length(Queue *queue) // 获取队列长度
{
  return queue->size;
}

bool is_empty(Queue *queue) // 判断是否是空队列
{
  return get_length(queue) == 0;
}

void push(Queue *queue, int value) // 入队，在队列末尾追加元素
{
  Node *p = init_linked_list_node(value);
  if (is_empty(queue))
  {
    queue->head = p;
    queue->tail = p;
  }
  else
  {
    queue->tail->next = p;
    queue->tail = p; // 更新队尾元素
  }
  queue->size++;
}

int peek(Queue *queue) // 访问队首的值
{
  return queue->head->value;
}

int pop(Queue *queue) // 出队，从队首删除元素
{
  Node *h = queue->head;
  int val = peek(queue);
  queue->head = h->next;
  queue->size--;
  free(h);
  return val;
}

void print_queue(Queue *queue) // 打印队列
{
  puts("From head to tail:");
  print_linked_list(queue->head);
}

void destory_queue(Queue *queue) // 销毁
{
  destory_linked_list(queue->head);
  free(queue);
}